/*
 * @Description:
 * @Version: 2.0
 * @Date: 2024-04-09 15:03:16
 * @LastEditTime: 2024-06-05 16:57:00
 */

import axios from "axios";
import type { AxiosInstance, AxiosError } from "axios";
import Global from "./Var";
import { ElMessage } from "element-plus";
import { local } from "@/utils/storage";
import { useRouter } from "vue-router";
import { Routes } from "@/router/routes";

// 响应码状态
enum R_CODE {
  // 失败
  FAILED,
  // 请求成功
  SUCCESS,
  // 无权限
  UN_AUTH,
  // 无功能权限
  FUNCTION_UN_AUTH,
}

const router = useRouter(); // 主要用于路由跳转

const MyReq: AxiosInstance = axios.create({
  // baseURL: Global.BASE_URL,
  timeout: 5000,
  withCredentials: true, // 允许自动携带 cookie 到请求头
  headers: {
    "Content-Type": "application/json",
    // token: local.get("token"),
    // source: "robotai",
  },
});

// axios请求拦截器
MyReq.interceptors.request.use(
  (config: any) => {
    const token = local.get("token");
    if (token) {
      // config.headers.token = token;
      config.headers.Authorization = token;
    }
    return config;
  },
  (error: AxiosError) => {
    return Promise.reject(error);
  }
);
// axios实例拦截响应
// MyReq.interceptors.response.use(
//   (response: AxiosResponse) => {
//     // if (response.status !== 200) {
//     //   ElMessage.error("请检查您的网络连接");
//     // }
//     return response;
//   },
//   // 请求失败
//   (error: any) => {
//     // 请求失败时的处理逻辑
//     if (error.response) {
//       // 后端返回了响应，但是状态码不是 2xx
//       ElMessage.error(error.response.data.message);
//       console.log(
//         "🚀 ~ 后端返回了响应，但是状态码不是 2xx:",
//         " 后端返回了响应，但是状态码不是 2xx"
//       );
//     } else if (error.Request) {
//       // 请求已发送，但是没有收到响应
//       ElMessage.error({ message: error });
//       console.log(
//         "🚀 ~ 请求已发送，但是没有收到响应:",
//         "请求已发送，但是没有收到响应"
//       );
//     } else {
//       // 在设置请求时发生了错误
//       ElMessage.error({ message: error });
//       console.log("🚀 ~  在设置请求时发生了错误:", "在设置请求时发生了错误");
//     }

//     // 返回一个 Promise，使得可以在后续的处理中继续处理这个错误
//     return Promise.reject({
//       message: error,
//     });
//   }
// );
// 配置响应拦截器
MyReq.interceptors.response.use(
  ({ data: response, status }) => {
    const { code, message, data } = response;
    if (status !== 200 && status !== 201) {
      ElMessage.warning({
        message: "请检查您的网络连接",
        type: "warning",
      });
    } else {
      if (code !== R_CODE.SUCCESS) {
        console.log('code::: ', code);
        switch (code) {
          case R_CODE.UN_AUTH: {
            local.remove("token");
            ElMessage.warning({
              message: "登录已过期",
              type: "warning",
            });
            router.replace(Routes.LOGIN);
            return Promise.reject({
              message: "暂无权限",
            });
          }
          case R_CODE.FAILED: {
            ElMessage.warning({
              message: message,
              type: "warning",
            });
            return Promise.reject({
              message,
            });
          }
          case R_CODE.FUNCTION_UN_AUTH: {
            ElMessage.warning({
              message: message,
              type: "warning",
            });
            return Promise.reject({
              message,
            });
          }
          default: {
            ElMessage.warning({
              message: message,
              type: "warning",
            });
            return Promise.reject({
              message,
            });
          }
        }
      }
    }
    return data;
  },
  (error) => {
    console.log('error::: ', error);
    // 对响应错误做些什么
    if (error.code === 'ECONNABORTED') {
      // 处理超时错误
      ElMessage.error('请求超时');
    } else if (error.response) {
      const { status, data,statusText } = error.response;
      const resData = data.message ? data.message : statusText
      ElMessage.error(status + ":" +  resData); // 显示错误消息给用户
    } else if (error.code === 'ERR_CANCELED') {
      ElMessage.warning("请求已终止," + error.message)
    } else {
      ElMessage.warning("请检查您的网络连接：," + error.message)
    }
    return Promise.reject(error);
  }
);
export default MyReq;

/**
 * 文件上传 方法封装
 * 上传文件传参方式注意为form-data格式
 */
// export function uploadFile<T>(url: string, uploadForm: any): Promise<T> {
//   const fd = new FormData();
//   fd.append("fileName", uploadForm.projectId);
//   fd.append("file", uploadForm.file);
//   return new Promise((resolve, reject) => {
//     MyReq.post(url, fd, {
//       headers: {
//         "Content-Type": "multipart/form-data",
//       },
//     })
//       .then((res: any) => {
//         if (res.data.code === 200 && res.headers["token"]) {
//           setCookie("token", res.headers["token"], 21600);
//         }
//         resolve(res.data);
//       })
//       .catch((err) => {
//         reject(err);
//       });
//   });
// }
